package cn.mln521.aop.demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 */
public class MyJdkProxy implements InvocationHandler {

    //要获取目标的引用
    private UserDao userDao;

    public MyJdkProxy(UserDao userDao) {
        this.userDao = userDao;
    }

    // 创建代理的方法 返回的是动态代理对象
     public Object createProxy() {
         Object proxy = Proxy.newProxyInstance(
                 userDao.getClass().getClassLoader(),
                 userDao.getClass().getInterfaces(),
                 this
         );
         return proxy;
     }

    /**
     * 调用目标类的方法就相当于调用 invoke方法
     * 需求：只对目标类的save方法进行增强
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if ("save".equals(method.getName())) {
            System.out.println("权限校验...");
            return method.invoke(userDao,args);
        }
        return method.invoke(userDao,args);
    }
}
